#pragma once
# include "DataVerifyOps.h"

size_t getline_(char** lineptr, size_t* n, FILE* stream) {
    // 检查是否有传入有效的 lineptr 和 n
    if (lineptr == NULL || n == NULL) {
        return -1; // 如果无效，返回错误
    }

    size_t buffer_size = *n;
    char* buffer = *lineptr;
    size_t position = 0;
    int ch;

    // 如果 buffer_size 为 0 或者 lineptr 中存储的指针为 NULL，进行内存分配
    if (buffer == NULL || buffer_size == 0) {
        buffer_size = 128; // 初始缓冲区大小
        buffer = (char*)malloc(buffer_size);
        if (buffer == NULL) {
            return -1; // 内存分配失败
        }
        *lineptr = buffer;  // 更新原始的 lineptr 指针
        *n = buffer_size;   // 更新传入的 buffer 大小
    }

    // 读取字符直到遇到换行符或文件结束
    while ((ch = fgetc(stream)) != EOF) {
        // 如果缓冲区不够大，重新分配内存
        if (position + 1 >= buffer_size) {
            buffer_size *= 2; // 增加缓冲区大小
            char* new_buffer = (char*)realloc(buffer, buffer_size);
            if (new_buffer == NULL) {
                return -1; // 内存分配失败
            }
            buffer = new_buffer;
            *lineptr = buffer;
            *n = buffer_size;
        }

        // 将字符存入缓冲区
        buffer[position++] = (char)ch;

        // 如果遇到换行符，结束输入
        if (ch == '\n') {
            break;
        }
    }

    // 如果读取到文件末尾且没有任何字符，返回 -1
    if (ch == EOF && position == 0) {
        return -1;
    }

    // 添加字符串结束符
    buffer[position] = '\0';

    return position;  // 返回读取的字符数
}


// 清空输入缓冲区
void clear_input_buffer() {
    while (getchar() != '\n' && getchar() != EOF);
}

uint8_t* get_message(size_t* message_len) {
    // 清空输入缓冲区
    clear_input_buffer();
    // 读取整行输入
    char input[MAX_INPUT_LENGTH];
    if (fgets(input, sizeof(input), stdin) == NULL) {
        printf("Input reading error!\n");
        return NULL;
    }

    // 去掉末尾的换行符（如果有）
    input[strcspn(input, "\n")] = '\0';

    // 输入的十六进制字符串长度
    size_t input_len = strlen(input);
    if (input_len % 2 != 0) {
        printf("Invalid input! Hexadecimal input must have an even length: %d\n", input_len);
        return NULL;
    }

    // 动态分配缓冲区
    size_t message_capacity = input_len / 2; // 每两个字符对应一个字节
    uint8_t* message = (uint8_t*)malloc(message_capacity);
    if (message == NULL) {
        printf("Memory allocation failed!\n");
        return NULL;
    }

    // 解析输入的十六进制字符串并转换成字节数组
    for (size_t i = 0; i < input_len; i += 2) {
        unsigned int byte;
        if (sscanf_s(input + i, "%2x", &byte) != 1) {
            printf("Invalid hexadecimal input!\n");
            free(message);
            return NULL;
        }
        message[*message_len] = (uint8_t)byte;
        (*message_len)++;  // 增加消息的长度
    }

    return message;
}